package protoc

import (
	"errors"
)

func BuildMsg(data string, cmd uint8) []byte {
	dataLen := 0
	byteData := []byte{}
	if len(data) > 0 {
		byteData = []byte(data)
		dataLen = len(byteData)
	}
	result := make([]byte, 6+dataLen)
	//固定消息头
	result[0] = byte(cmd << 2)
	//协议版本
	result[1] = byte(PPTP_V3)
	if byteData != nil {
		// 消息长度高位
		result[4] = byte((dataLen >> 8) & 0xff)
		// 消息长度低位
		result[5] = byte(dataLen & 0xff)
		//fmt.Printf("复制前：%s,长度:%d \n",string(result),len(result))
		ArrayCopy(byteData, 0, result, 6, dataLen)
		//fmt.Printf("复制后：%s 长度:%d \n",string(result),len(result))
	}
	return result
}

func ArrayCopy(src []byte, srcOffset int, dst []byte, dstOffset, count int) (bool, error) {
	srcLen := len(src)
	if srcOffset > srcLen || count > srcLen || srcOffset+count > srcLen {
		return false, errors.New("源缓冲区 索引超出范围")
	}
	dstLen := len(dst)
	if dstOffset > dstLen || count > dstLen || dstOffset+count > dstLen {
		return false, errors.New("目标缓冲区 索引超出范围")
	}
	index := 0
	for i := srcOffset; i < srcOffset+count; i++ {
		dst[dstOffset+index] = src[srcOffset+index]
		index++
	}
	//fmt.Printf("复制后ArrayCopy函数内：%s 长度:%d \n",string(dst),len(dst))
	return true, nil
}
